02.03.03 矩阵
正如向量将标量从零阶推广到一阶,矩阵将向量从一阶推广到二阶。 矩阵,我们通常用粗体、大写字母来表示 (例如X,Y、和Z), 在代码中表示为具有两个轴的张量。
数学表示法使用A∈Rm*n来表示矩阵,其由行和列的实值标量组成。 我们可以将任意矩阵A∈Rm*n视为一个表格, 其中每个元素属于aij第i行第j列:

对于A∈Rm*n, A的形状是(m,n)或m*n。 当矩阵具有相同数量的行和列时,其形状将变为正方形; 因此,它被称为方阵(square matrix)。
当调用函数来实例化张量时, 我们可以通过指定两个分量m和n来创建一个形状为m*n的矩阵。
import torch
x=torch.arange(20).reshape(4,5)
print(x)
返回值:
tensor([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
我们可以通过行索引(i)和列索引(j)来访问矩阵中的标量元素aij, 例如[A]ij。 如果没有给出矩阵A的标量元素,如在 (2.3.2)那样, 我们可以简单地使用矩阵A的小写字母索引下标aij来引用[A]ij。 为了表示起来简单,只有在必要时才会将逗号插入到单独的索引中, 例如a2,3j和[A]2i-1,3。
当我们交换矩阵的行和列时,结果称为矩阵的转置(transpose)。 通常用aT来表示矩阵的转置,如果B=A, 则对于任意i和j,都有bij=aji。 因此,在 (2.3.2)中的转置是一个形状为的矩阵:

现在在代码中访问矩阵的转置。
import torch
A=torch.arange(20).reshape(4,5)
print(A)
print(A.T)
返回值:
tensor([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
tensor([[ 0, 5, 10, 15],
[ 1, 6, 11, 16],
[ 2, 7, 12, 17],
[ 3, 8, 13, 18],
[ 4, 9, 14, 19]])
作为方阵的一种特殊类型,对称矩阵(symmetric matrix)A等于其转置A=AT:。 这里定义一个对称矩阵B:
现在我们将B与它的转置进行比较。
import torch
B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
print(B)
print(B.T)
print(B==B.T)
返回值:
tensor([[1, 2, 3],
[2, 0, 4],
[3, 4, 5]])
tensor([[1, 2, 3],
[2, 0, 4],
[3, 4, 5]])
tensor([[True, True, True],
[True, True, True],
[True, True, True]])
矩阵是有用的数据结构:它们允许我们组织具有不同模式的数据。 例如,我们矩阵中的行可能对应于不同的房屋(数据样本),而列可能对应于不同的属性。 曾经使用过电子表格软件或已阅读过 2.2节的人,应该对此很熟悉。 因此,尽管单个向量的默认方向是列向量,但在表示表格数据集的矩阵中, 将每个数据样本作为矩阵中的行向量更为常见。 后面的章节将讲到这点,这种约定将支持常见的深度学习实践。 例如,沿着张量的最外轴,我们可以访问或遍历小批量的数据样本。